#include <cassert>
#include <cstddef>
#include <iostream>
#include <vector>
using namespace std;

namespace xywl {
    template <size_t N>
    class bitset {
        public:
            // 构造函数
            bitset() {
                _bits.resize(N / 32 + 1, 0);
            }
            // 反转
            void flip(size_t pos) {
                assert(pos < N);
                // 算出是那个int块的
                int i = pos / 32;
                // 算出是块里面的那个位置
                int j = pos % 32;
                // 使用异或操作来调整
                _bits[i] ^= (1 << j);
            }
            // 设置
            void set(size_t pos) {
                assert(pos < N);
                // 算出是那个int块的
                int i = pos / 32;
                // 算出是块里面的那个位置
                int j = pos % 32;
                // 使用或操作来调整
                _bits[i] |= (1 << j);
            }
            // 清空
            void reset(size_t pos) {
                assert(pos < N);
                int i = pos / 32;
                int j = pos % 32;
                _bits[i] &= (~(1 << j));
            }
            // 获取
            bool test(size_t pos) {
                assert(pos < N);
                int i = pos / 32;
                int j = pos % 32;
                return _bits[i] & (1 << j);
            }
            // 获取位数
            size_t size() {
                return N;
            }
            // 获取1的位数
            size_t count() {
                size_t temp = 0;
                for(auto& s : _bits) {
                    int t = s;
                    while(t) {
                        if(t & 1) {
                            temp++;
                        }
                        t = t >> 1;
                    }
                }
            }
            // 判断是不是所有的位都没被设置
            bool none() {
                // 复用我们的any
                return !any();
            }
            // 判断位图中是不是所有的位都是被设置的
            bool all() {
                size_t n = _bits.size();
                // 先判断整块的，再判断零散的
                for(size_t i = 0; i < n - 1; i++) {
                    if(~_bits[i] != 0) {
                        return false;
                    }
                }
                // 零散的
                for(size_t i = 0; i < N % 32; i++) {
                    if((_bits[n - 1] & (1 << i)) == 0) {
                        return false;
                    }
                }
                return true;
            }
            // 判断是不是有位图里面有1
            bool any() {
                // 只要有一个有值就返回true
                for(auto& s : _bits) {
                    if(s) {
                        return true;
                    }
                }
                return false;
            }
        private:
            vector<unsigned int> _bits; 
    };
}